; void blit(Uint8 *imagen, Uint32 ancho_imagen, Uint32 alto_imagen, Uint32 x, Uint32 y, Color rgb);

extern screen_pixeles

; constantes globales

	%include "constantes.mac"

; constantes locales

	%define mascara_4to_byte 0xff000000
	%define pila_local 4

; parametros

	%define imagen		[ebp + 08]
	%define ancho_imagen	[ebp + 12]
	%define alto_imagen	[ebp + 16]
	%define coord_x		[ebp + 20]
	%define coord_y		[ebp + 24]
	%define rgb		[ebp + 28]

; variables

	%define columna		[ebp - 4]

global blit

section .text

blit:

	push ebp			; creo el marco de la pila
	mov ebp, esp			; creo el marco de la pila
	sub esp, pila_local		; pido memoria en la pila
	push ebx			; salvo registros convencion C
	push edi			; salvo registros convencion C
	push esi			; salvo registros convencion C

inicializo_variables:

	mov edi, dword [screen_pixeles]	; edi = puntero al destino (pantalla)
	
	mov eax, ancho_pantalla_bytes
	mov ebx, coord_y
	mul ebx
	add edi, eax			; edi en la fila adecuada
	
	mov eax, coord_x
	mov ebx, bytes_por_pixel
	mul ebx
	add edi, eax			; edi en el punto adecuado

	mov esi, imagen			; esi = puntero a la fuente (imagen)

	mov ecx, alto_imagen		; ecx = contador de filas

ciclo_filas:

	mov edx, ancho_imagen		; edx = contador de columnas

ciclo_columnas:

	mov eax, [esi]			; extraigo pixel del buffer
	and eax, mascara_pixel		; extraigo pixel del buffer

	mov ebx, rgb
	and ebx, mascara_pixel

	cmp eax, ebx			; comparo buffer contra color off
	je es_color_off			; si son iguales entonces ES color off

	jmp siguiente_columna

es_color_off:

	mov ebx, [edi]			; reemplazo el pixel por el fondo
	and ebx, mascara_pixel		; reemplazo el pixel por el fondo

	mov eax, [esi]			; conservo el ultimo byte
	and eax, mascara_4to_byte	; conservo el ultimo byte
	or ebx, eax			; conservo el ultimo byte

	mov [esi], ebx			; piso la imagen

siguiente_columna:

	add edi, bytes_por_pixel	; avanzo puntero buffer
	add esi, bytes_por_pixel	; avanzo puntero imagen

	dec edx
	cmp edx, 0
	je siguiente_fila
	jmp ciclo_columnas
	
siguiente_fila:

	mov eax, ancho_imagen
	shr eax, 2
	shl eax, 2
	mov ebx, ancho_imagen
	sub ebx, eax

	add esi, ebx
	add edi, ancho_pantalla_bytes

	mov eax, ancho_imagen
	add eax, ancho_imagen
	add eax, ancho_imagen

	sub edi, eax

	loop ciclo_filas

fin:

	pop esi				; desarmo el stack frame
	pop edi				; desarmo el stack frame
	pop ebx				; desarmo el stack frame
	add esp, pila_local		; pido memoria en la pila
	pop ebp				; desarmo el stack frame

	ret
